home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Tutorial / Cookbook / 42.DocApp / Document.m < prev    next >
Text File  |  1995-06-12  |  3KB  |  136 lines

  1.  
  2. /* Generated by Interface Builder */
  3.  
  4. #import "DocApp.h"
  5. #import "Document.h"
  6. #import <appkit/defaults.h>
  7. #import <appkit/Application.h>
  8. #import <appkit/Window.h>
  9. #import <appkit/Text.h>
  10. #import <appkit/ScrollView.h>
  11. #import <appkit/Cursor.h>
  12. #import <appkit/SavePanel.h>
  13. #import <streams/streams.h>
  14. #import <string.h>
  15. #import <sys/file.h>
  16.  
  17. @implementation Document
  18.  
  19. + new
  20. {
  21.     self = [super new];
  22.     if (![NXApp loadNibSection:"Document.nib" owner:self]) {
  23.         [self free];
  24.         return nil;
  25.     }
  26.     [self setName:"Untitled"];
  27.     [[document window] setDelegate:self];
  28.     [[document docView] setDelegate:self];
  29.     [[document window] makeKeyAndOrderFront:self];
  30.     
  31.     return self;
  32. }
  33.  
  34. + newFromFile:(const char *)fileName
  35. {
  36.     NXStream    *st;
  37.     
  38.     if (st = NXMapFile(fileName, NX_READONLY)) {
  39.         self = [self new];
  40.         [NXWait push];
  41.         [[document docView] readText: st];
  42.         [document display];
  43.         [self setName:fileName];
  44.         NXCloseMemory (st, NX_FREEBUFFER);
  45.         [NXWait pop];
  46.         return self;
  47.     } else {
  48.         return nil;
  49.     }
  50. }
  51.  
  52. - save:sender 
  53. {
  54.     const char *fileName = [self name];
  55.  
  56.     if ((fileName == NULL) ||
  57.     (strcmp (fileName, "Untitled") == 0) || (strcmp (fileName, "") == 0)) {
  58.       if ([[NXApp savePanel] runModalForDirectory:"." file:"Untitled"] == NO) 
  59.     return (self);
  60.       else
  61.     fileName = [[NXApp savePanel] filename];
  62.     }
  63.  
  64.     if (fileName) [self saveDocument:fileName];
  65.   
  66.     return self;
  67. }
  68.  
  69. - saveAs:sender 
  70. {
  71.     if ([[NXApp savePanel] runModalForDirectory:"." file:[self name]]) 
  72.         [self saveDocument:[[NXApp savePanel] filename]];
  73.  
  74.     return self;
  75. }
  76.  
  77. - setDocument:anObject
  78. {
  79.     document = anObject;
  80.     return self;
  81. }
  82.  
  83. - saveDocument:(const char *)fileName
  84. {
  85.     BOOL saveOK;
  86.     int fd;
  87.     NXStream *stream = NULL;
  88.  
  89.     [NXWait push];
  90.     if (saveOK = 
  91.       (((fd = open (fileName, O_WRONLY|O_CREAT|O_TRUNC, 0644)) != -1) &&
  92.             (stream = NXOpenFile (fd, NX_WRITEONLY))))
  93.     [[document docView] writeText:stream];
  94.     if (stream) NXClose (stream);
  95.     if (fd != -1) close (fd);
  96.     [NXWait pop];
  97.  
  98.     if (saveOK) {
  99.           [self setName:fileName];
  100.     [[document window] setDocEdited:NO];
  101.     } else NXRunAlertPanel (NULL, "Can't write file.", "OK", NULL, NULL);
  102.  
  103.     return self;
  104. }
  105.  
  106. - setName:(const char *)documentName
  107. {
  108.     [[document window] setTitle:documentName];
  109.     return self;
  110. }
  111.  
  112. -(const char *)name
  113. {
  114.     return [[document window] title];
  115. }
  116.  
  117. - text:text isEmpty:(BOOL)empty
  118. {
  119.     if (![[document window] isDocEdited]) 
  120.         [[document window] setDocEdited:YES];
  121.     return NO;
  122. }
  123.  
  124. - windowWillClose:sender
  125. {
  126.     if ([[document window] isDocEdited]) 
  127.         if (NXRunAlertPanel
  128.           (NULL, "File was edited.", "Save", "Cancel", NULL))
  129.             [self save:self];
  130.     [sender setDelegate:nil];  
  131.     [self free];
  132.     return sender;
  133. }
  134.  
  135. @end
  136.